package com.psnoted.backend.service;

import com.psnoted.backend.entity.User;
import com.psnoted.backend.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * 用户服务类
 * 提供用户管理相关的业务逻辑
 * 
 * @author PSNoted Team
 * @version 1.0.0
 */
@Service
@Transactional
public class UserService {

    private static final Logger logger = LoggerFactory.getLogger(UserService.class);

    @Autowired
    private UserRepository userRepository;

    /**
     * 创建新用户
     * 
     * @param keyHash 密钥哈希
     * @param username 用户名
     * @return 创建的用户
     */
    public User createUser(String keyHash, String username) {
        logger.info("创建新用户: keyHash={}, username={}", keyHash, username);
        
        User user = new User(keyHash, username);
        user.setStatus("active");
        user.setCreatedAt(LocalDateTime.now());
        
        User savedUser = userRepository.save(user);
        logger.info("用户创建成功: id={}, keyHash={}, username={}", 
            savedUser.getId(), savedUser.getKeyHash(), savedUser.getUsername());
        
        return savedUser;
    }

    /**
     * 根据密钥哈希查找用户
     * 
     * @param keyHash 密钥哈希
     * @return 用户信息
     */
    public Optional<User> findByKeyHash(String keyHash) {
        return userRepository.findByKeyHash(keyHash);
    }

    /**
     * 根据密钥哈希查找活跃用户
     * 
     * @param keyHash 密钥哈希
     * @return 活跃用户信息
     */
    public Optional<User> findActiveUserByKeyHash(String keyHash) {
        return userRepository.findByKeyHashAndStatus(keyHash, "active");
    }

    /**
     * 根据用户名查找用户
     * 
     * @param username 用户名
     * @return 用户信息
     */
    public Optional<User> findByUsername(String username) {
        return userRepository.findByUsername(username);
    }

    /**
     * 更新用户最后登录时间
     * 
     * @param keyHash 密钥哈希
     * @return 是否更新成功
     */
    public boolean updateLastLoginTime(String keyHash) {
        logger.info("更新用户最后登录时间: keyHash={}", keyHash);
        
        LocalDateTime now = LocalDateTime.now();
        int updatedRows = userRepository.updateLastLoginAt(keyHash, now);
        
        boolean success = updatedRows > 0;
        if (success) {
            logger.info("用户最后登录时间更新成功: keyHash={}, lastLoginAt={}", keyHash, now);
        } else {
            logger.warn("用户最后登录时间更新失败: keyHash={}", keyHash);
        }
        
        return success;
    }

    /**
     * 软删除用户
     * 
     * @param keyHash 密钥哈希
     * @return 是否删除成功
     */
    public boolean softDeleteUser(String keyHash) {
        logger.info("软删除用户: keyHash={}", keyHash);
        
        int updatedRows = userRepository.updateStatusByKeyHash(keyHash, "deleted");
        
        boolean success = updatedRows > 0;
        if (success) {
            logger.info("用户软删除成功: keyHash={}", keyHash);
        } else {
            logger.warn("用户软删除失败: keyHash={}", keyHash);
        }
        
        return success;
    }

    /**
     * 检查用户是否存在
     * 
     * @param keyHash 密钥哈希
     * @return 是否存在
     */
    public boolean existsByKeyHash(String keyHash) {
        return userRepository.existsByKeyHash(keyHash);
    }

    /**
     * 获取所有活跃用户
     * 
     * @return 活跃用户列表
     */
    public List<User> getAllActiveUsers() {
        // 这里可以添加自定义查询方法，暂时使用findAll然后过滤
        return userRepository.findAll().stream()
            .filter(user -> "active".equals(user.getStatus()))
            .toList();
    }

    /**
     * 保存用户
     * 
     * @param user 用户对象
     * @return 保存后的用户
     */
    public User saveUser(User user) {
        return userRepository.save(user);
    }
} 